package 爆刷leetcode.balabala;

/**
 * @Author yaya
 * @Create 2024/5/17 21:03
 * Description:
 */
public class Coding {
    public static void main(String[] args) {
        int nums[] = {0,1,8,7,1,0,3,12};
        moveZeroes2Plus(nums);
        System.out.println(nums);
    }

    public static int search(int[] nums, int target) {


        int length = nums.length;
        int left = 0;
        int right = length - 1;

        while (left <= right) {
            if (nums[left] == target) {
                return left;
            }
            if (nums[right] == target) {
                return right;
            }

            if (nums[left] < target) {
                left++;
            }
            if (nums[right] > target) {
                right--;
            }
        }

        return -1;
    }


    // 0,1,0,3,12
    // 12 ----- 0
    // 不限制原数组位置
    public static void moveZeroes(int[] nums) {
        int length = nums.length;
        int left = 0;
        int right = length - 1;
        int temp;
        while (left < right) {
            if (nums[left] == 0) {
                if (nums[right] != 0) {
                    // 交换
                    temp = nums[left];
                    nums[left] = nums[right];
                    nums[right] = temp;
                    left++;
                    right--;
                } else {
                    right--;
                    break;
                }
            }
            left++;
        }
    }

    public static void moveZeroes2(int[] nums) {
        // 处理不用处理的数据
        if (nums.length == 1) {
            return;
        }

        // 非0数字的队列
        int notZeroNum = 0;


        for (int i = 0; i < nums.length; i++) {
            // 如果这个数不是0，并且当他为第一个不是0的数，原地不动
            // 如果不是按顺序排列的非零数，则将这个数插入非0数字队列
            if (nums[i] != 0) {
                if (i == notZeroNum) {
                    notZeroNum++;
                } else {
                    nums[notZeroNum] = nums[i];
                    notZeroNum++;
                }
            }
        }

        // 将之后的字段填充为0
        for (int i = notZeroNum; i < nums.length; i++) {
            nums[i] = 0;
        }

    }

    public static void moveZeroes2Plus(int[] nums){
        int left = 0,right = 0;
        int temp = 0;

        // left指针永远停留在处于0的数上
        // right指针则是寻找下一个不等于0的数
        // 有不等于0的数就和left调换位置，
        while (right < nums.length){
            if (nums[right] != 0){
                temp = nums[right];
                nums[right] = nums[left];
                nums[left] = temp;

                left++;
            }

            right++;
        }



    }


}


